「自分の環境では動くのに…」というフレーズは、開発者にとって古くからの悩みです。Dockerは、この「環境差異」の問題を根本的に解決するコンテナ技術です。本記事では、Dockerの概念から実践的な使い方まで、30分で理解できるように解説します。

💡 この記事のポイント

Dockerは「軽量な仮想環境」です。アプリケーションとその実行環境をまるごとパッケージ化し、どこでも同じ動作を保証します。

1. Dockerとは?

Dockerはコンテナ型仮想化技術のプラットフォームです。従来の仮想マシン(VM)と比較して、軽量かつ高速に起動できます。

VMとコンテナの違い

  • 仮想マシン:OS全体を仮想化 → 重い(GBレベル)、起動に分単位
  • コンテナ:アプリ + 依存関係のみ → 軽い(MBレベル)、起動は秒単位

Dockerの主要概念

  • イメージ:コンテナの設計図(テンプレート)
  • コンテナ:イメージから作られた実行環境
  • Dockerfile:イメージを構築するための設定ファイル
  • Docker Hub:イメージを共有するレジストリ

2. インストールと初期設定

# macOS(Homebrew)
brew install --cask docker

# Windows(winget)
winget install Docker.DockerDesktop

# Linux(Ubuntu)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

# インストール確認
docker --version
# Docker version 26.x.x
docker run hello-world

3. 基本コマンド

# イメージの取得
docker pull node:20-slim

# コンテナの起動
docker run -d --name my-app -p 3000:3000 node:20-slim

# 実行中のコンテナ一覧
docker ps

# すべてのコンテナ一覧(停止含む)
docker ps -a

# コンテナのログ確認
docker logs my-app

# コンテナ内でコマンド実行
docker exec -it my-app bash

# コンテナの停止・削除
docker stop my-app
docker rm my-app

# 不要なリソースを一括削除
docker system prune -a
広告

4. Dockerfileの書き方

Node.jsアプリケーションの実践的なDockerfileを見てみましょう。

# ベースイメージの指定
FROM node:20-slim AS builder

# 作業ディレクトリ
WORKDIR /app

# 依存関係のインストール(キャッシュ活用)
COPY package*.json ./
RUN npm ci

# アプリケーションコードのコピー
COPY . .

# ビルド
RUN npm run build

# 本番用ステージ(マルチステージビルド)
FROM node:20-slim AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./

# 非rootユーザーで実行
USER node

EXPOSE 3000
CMD ["node", "dist/server.js"]
✅ 実践のヒント

マルチステージビルドを使用すると、ビルドツール(TypeScriptコンパイラ等)が本番イメージに含まれず、最終的なイメージサイズを大幅に削減できます。

5. docker-composeで複数コンテナ管理

実際の開発では、アプリ + DB + Redis のように複数のサービスを同時に動かします。docker-composeを使えば、ワンコマンドで全サービスを起動できます。

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - '3000:3000'
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
      - REDIS_URL=redis://cache:6379
    depends_on:
      - db
      - cache
    volumes:
      - .:/app          # ホットリロード用
      - /app/node_modules

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - '5432:5432'

  cache:
    image: redis:7-alpine
    ports:
      - '6379:6379'

volumes:
  pgdata:
# 全サービスの起動
docker compose up -d

# ログの確認
docker compose logs -f app

# 全サービスの停止
docker compose down

# データも含めて完全削除
docker compose down -v

6. ベストプラクティス

  • 軽量ベースイメージ-slim-alpineを使う
  • .dockerignoreを設定:node_modules.git等を除外
  • レイヤーキャッシュを活用:変更頻度の低いものを先にCOPY
  • 非rootユーザーで実行:セキュリティ向上
  • ヘルスチェックを設定:コンテナの健全性監視
  • マルチステージビルド:本番イメージの最小化

Dockerは現代のソフトウェア開発に欠かせないツールです。まずはシンプルなプロジェクトからDockerを使い始めて、徐々にdocker-composeやCI/CDとの連携に進んでいきましょう。